package com.dong.service;
//package com.dong.mybatis.service;

//import com.dong.mybatis.dto.Zone1AlarmResult;
//import com.dong.mybatis.entity.Zone1AlarmThreshold;
//import com.dong.mybatis.mapper.Zone1AlarmThresholdMapper;
import com.dong.beans.Zone1AlarmResult;
import com.dong.mybatis.entity.Zone1AlarmThresholds;
import com.dong.mybatis.mapper.Zone1AlarmThresholdsMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor // Lombok自动注入Mapper，避免手动写@Autowired
public class Zone1AlarmService {

    private final Zone1AlarmThresholdsMapper thresholdMapper;

    /**
     * 核心方法：判断单个参数是否触发报警
     * @param parameter 参数名（必须与zone1表字段、阈值表parameter一致，如"temp"）
     * @param actualValue zone1表中该参数的实际数值（如27.004999）
     * @return 报警结果（包含是否报警、阈值范围等信息）
     */
    public Zone1AlarmResult checkThresholdAlarm(String parameter, Double actualValue) {
//        // 1. 校验入参（避免空值导致后续异常）
//        if (parameter == null || parameter.trim().isEmpty()) {
//            throw new IllegalArgumentException("参数名不能为空！");
//        }
//        if (actualValue == null) {
//            throw new IllegalArgumentException("实际数值不能为空！");
//        }

        // 2. 查询该参数的「启用状态」阈值
        Optional<Zone1AlarmThresholds> thresholdOpt = thresholdMapper.getEnabledThresholdByParam(parameter);

//        // 3. 处理“无阈值配置”或“阈值未启用”的情况
//        if (thresholdOpt.isEmpty()) {
//            return new Zone1AlarmResult(
//                    parameter,
//                    actualValue,
//                    null,
//                    null,
//                    false, // 无启用阈值，不报警
//                    "该参数未配置启用的阈值，暂不判断"
//            );
//        }

        // 4. 有启用阈值，开始判断是否报警
        Zone1AlarmThresholds threshold = thresholdOpt.get();
        Double min = threshold.getMinValue();
        Double max = threshold.getMaxValue();
        boolean isAlarm = false;
        StringBuilder alarmMsg = new StringBuilder();

        // 4.1 判断是否低于最低阈值（minValue不为null时才判断）
        if (min != null && actualValue < min) {
            isAlarm = true;
            alarmMsg.append(parameter).append("低于阈值：").append(actualValue).append(" < ").append(min);
        }

        // 4.2 判断是否高于最高阈值（maxValue不为null时才判断，若已触发低阈值则追加描述）
        if (max != null && actualValue > max) {
            isAlarm = true;
            if (alarmMsg.length() > 0) {
                alarmMsg.append("，且");
            }
            alarmMsg.append(parameter).append("高于阈值：").append(actualValue).append(" > ").append(max);
        }

        // 4.3 未触发任何报警
        if (!isAlarm) {
            alarmMsg.append(parameter).append("正常，数值在阈值范围内");
        }

        // 5. 封装并返回结果
        return new Zone1AlarmResult(
                parameter,
                actualValue,
                min,
                max,
                isAlarm,
                alarmMsg.toString()
        );
    }

    /**
     * 重载方法：批量判断zone1表的多个参数（如同时判断temp、humi、a、v、l）
     * @param paramValues 键值对：key=参数名，value=实际数值
     * @return 多个参数的报警结果列表
     */
    public List<Zone1AlarmResult> batchCheckThresholdAlarm(Map<String, Double> paramValues) {
        if (paramValues == null || paramValues.isEmpty()) {
            throw new IllegalArgumentException("批量判断的参数不能为空！");
        }

        // 循环调用单个判断方法，收集结果
        return paramValues.entrySet().stream()
                .map(entry -> checkThresholdAlarm(entry.getKey(), entry.getValue()))
                .collect(Collectors.toList());
    }
}